// Modules to control application life and create native browser window
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
const Store = require('electron-store')
const path = require('path')
const store = new Store()
console.log(app.getPath('userData'))
store.set('unicorn', 'horse')
console.log(store.get('unicorn'))

// 工厂模式
function appWindowFactory(file, config, openDevTools) {
  const basicConfig = {
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      // 官网似乎说是默认false，但是这里必须设置contextIsolation
      contextIsolation: false,
    },
    show: false,
    backgroundColor: '#fff',
  }

  const finalConfig = { ...basicConfig, ...config }

  const window = new BrowserWindow(finalConfig)

  window.loadFile(file)

  // Open the DevTools.
  if (openDevTools) {
    window.webContents.openDevTools()
  }

  window.once('ready-to-show', () => {
    window.show()
  })

  return window
}

let mainWindow = null
function createWindow() {
  // Create the browser window.
  mainWindow = appWindowFactory('./renderer/index.html', null, false)
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
  createWindow()

  app.on('activate', function () {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })

  ipcMain.on('message', (event, arg) => {
    console.log(arg)
    // event.sender.send('reply', 'hello from main')
    mainWindow.send('reply', 'hello from main')
  })

  ipcMain.on('add-music-window', () => {
    const addWindow = appWindowFactory('./renderer/add.html', {
      width: 500,
      height: 400,
      parent: mainWindow,
    })
  })

  ipcMain.on('open-music-file', (event) => {
    dialog
      .showOpenDialog({
        properties: ['openFile', 'multiSelections'],
        filters: [{ name: 'Musics', extensions: ['mp3'] }],
      })
      .then((result) => {
        console.log(result.canceled)
        console.log(result.filePaths)
        if (!result.canceled) {
          event.sender.send('selected-file', result.filePaths)
        }
      })
      .catch((err) => {
        console.log(err)
      })
  })
})

// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
